// @Desc:
// @CreateTime: 2020/11/1
package wx

import (
    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
    "mycrm.com/controller/statistics"
    mlog "mycrm.com/log"
    "mycrm.com/module"
    "mycrm.com/module/user"
    "net/http"
    "regexp"
    "strings"
    "time"
)

// 微信 index
func ComeWxMsg(c *gin.Context) {
    if c.Query("echostr") != "" {
        // 用于微信配置验签返回的
        c.Writer.Write([]byte(c.Query("echostr")))
        return
    }
    var reqMsg WXReqMsg
    if err := c.ShouldBindXML(&reqMsg); err != nil {
        mlog.Log.Error("c.ShouldBindXML(&reqMsg) is failed, err: ", err)
    }
    mlog.Log.Info("wxreqData: ", reqMsg)
    msgType := reqMsg.MsgType
    switch msgType {
    case "event":
        WXMsgReplyEvent(c, &reqMsg)
    case "voice":
        WXMsgReplyVoice(c, &reqMsg)
    default: // 默认按文本回复
        WXMsgReplyText(c, &reqMsg, "")
    }
}

// 取消/关注事件
func WXMsgReplyEvent(c *gin.Context, reqText *WXReqMsg) {
    // subscribe(订阅)、unsubscribe(取消订阅)
    if reqText.Event == "subscribe" {
        // 您好，欢迎关注南部县盛嘉装饰！如果需要帮助您可以通过聊天窗口咨询，客服会第一时间回复您的信息！您也可以拨打电话0817-5663992直接沟通，或者您也可留下您的联系方式。
        respText := "欢迎您关注南部县盛嘉装饰！您可以拨打电话0817-5663992直接咨询，或者您也可留下您的联系方式\n" +
                    "\n" +
                    "注: 如果您是【员工】烦请您发下您的电话号码, 后期才能更好的为您提供任务查询等服务!"
        WXMsgReplyText(c, reqText, respText)
    }
    if reqText.Event == "unsubscribe" {
        // 将 user 中的 open_id 清空, is_attention 为 0
        module.Db.Model(&user.CrmUser{}).Where("open_id = ?", c.Query("openid")).Updates(map[string]interface{}{"is_attention": 0, "open_id": ""})
    }
}

// WXMsgReplyText 微信消息回复
func WXMsgReplyText(c *gin.Context, reqMsg *WXReqMsg, respText string) {
    respTextMsg := &WXRespTextMsg{
        ToUserName:   reqMsg.FromUserName,
        FromUserName: reqMsg.ToUserName,
        CreateTime:   time.Now().Unix(),
        MsgType:      "text",
    }
    // 如果有回复文本就直接回复
    if respText != "" {
        respTextMsg.Content = respText
        mlog.Log.Info("wxrespXml: ", respTextMsg)
        c.XML(http.StatusOK, &respTextMsg)
        return
    }

    // 回复前缀
    // respTextMsg.Content = fmt.Sprintf("[%s]:\n", time.Now().Format("15:04:05"))
    openId := c.Query("openid")
    switch reqMsg.Content {
    case "1":
        // 获取我的回访任务
        respTextMsg.Content = statistics.MyTask2Wx(openId)
    case "2":
        // 统计
        respTextMsg.Content = statistics.Statistics2Wx(openId)
    default:
        // 纪念使用
        if strings.Contains(reqMsg.Content, "爱") {
            respTextMsg.Content += "薛爱珊一辈子哟!"
        }

        // 先判断下数字是否是电话, 不是的话就回复下命令数字
        isPhone, _ := regexp.MatchString(`^(13[0-9]{9}$|14[0-9]{9}$|15[0-9]{9}$|17[0-9]{9}$|18[0-9]{9})$|(^(0\d{10})|^(0\d{2}-\d{8}))$`, reqMsg.Content)
        mlog.Log.Info("isPhone: ", isPhone)
        if isPhone {
            TextIsPhone(c, reqMsg, respTextMsg)
        } else {
            // 如果这里没有内容才添加值
            if respTextMsg.Content == "" {
                respTextMsg.Content = "您可以回复以下数字:\n" +
                    "1. 我的今日回访任务\n" +
                    "2. 统计\n" +
                    "\n" +
                    "注: 如果未成功进行电话配对回复的命令无效!"
            }
        }
    }
    c.XML(http.StatusOK, &respTextMsg)
}

// 是联系电话, 进行对用户进行关联
func TextIsPhone(c *gin.Context, reqMsg *WXReqMsg, respTextMsg *WXRespTextMsg) {
    err := module.Db.Model(&user.CrmUser{}).Where("phone = ?", reqMsg.Content).Updates(map[string]interface{}{"is_attention": 1, "open_id": c.Query("openid")}).Error
    if err == gorm.ErrRecordNotFound {
        // respTextMsg.Content = "您填写的电话, 客户系统不存在, 请重新填写"
        respTextMsg.Content = "感谢您的留言电话, 我们会在 24 小时之内与您联系! \n" +
                              "\n" +
                              "注: 如果您是【员工】您的联系方式与系统联系不匹配, 请输入正确的联系方式!"
    } else {
        respTextMsg.Content = "恭喜您成功完成电话号码配对!\n" +
            "\n" +
            "您可以回复以下数字:\n" +
            "1. 我的今日回访任务\n" +
            "2. 统计\n" +
            "\n" +
            "说明: 支持语音识别, 如: 统计-则会返回【统计】"
    }
}

// WXMsgReplyText 微信消息回复
func WXMsgReplyVoice(c *gin.Context, reqText *WXReqMsg) {
    respTextMsg := WXRespTextMsg{
        ToUserName:   reqText.FromUserName,
        FromUserName: reqText.ToUserName,
        CreateTime:   time.Now().Unix(),
        MsgType:      "text",
    }
    openId := c.Query("openid")
    // 纪念使用
    if strings.Contains(reqText.Recognition, "爱") {
        respTextMsg.Content = "薛爱珊一辈子哟!"
    }
    if strings.Contains(reqText.Recognition, "任务") {
        // 我的任务
        respTextMsg.Content = statistics.MyTask2Wx(openId)
    }
    if strings.Contains(reqText.Recognition, "统计") {
        // 统计
        respTextMsg.Content = statistics.Statistics2Wx(openId)
    }
    if respTextMsg.Content == "" {
        respTextMsg.Content = "主人暂时没有您要的内容: \n" +
            reqText.Recognition
    }

    mlog.Log.Info("wxrespXml: ", respTextMsg)
    c.XML(http.StatusOK, &respTextMsg)
}
